package com.xue.asyncdemo202402;

import java.nio.charset.StandardCharsets;
import java.util.Base64;

public class XORCipher {

	// XOR 加密和解密方法
	private static byte[] xorEncryptDecrypt(byte[] data, byte key) {
		byte[] result = new byte[data.length];

		for (int i = 0; i < data.length; i++) {
			result[i] = (byte) (data[i] ^ key); // 对每个字节进行 XOR 操作
		}

		return result;
	}

	// Base64 编码
	private static String base64Encode(byte[] data) {
		return Base64.getEncoder().encodeToString(data);
	}

	// Base64 解码
	private static byte[] base64Decode(String data) {
		return Base64.getDecoder().decode(data);
	}

	public static void main(String[] args) {
		String text = "Hello, 世界!127.0.0.1 56  http://localhost:1234/a.mp4 E:/BaiduNetdiskDownload/01.高数基础/01新文道版本/31.第五章-定积分的应用.mp4"; // 包含中文

		String encodedEncrypted = encode(text);
		System.out.println("Original: " + text);
		System.out.println("Encrypted (Base64): " + encodedEncrypted);
		String decrypted = decode(encodedEncrypted);

		System.out.println("Decrypted: " + decrypted);
	}

	public static String encode(String text) {
		byte key = 'x'; // 选择一个字符作为密钥
		// 将原始文本转换为字节数组
		byte[] originalBytes = text.getBytes(StandardCharsets.UTF_8);
		// 加密
		byte[] encryptedBytes = xorEncryptDecrypt(originalBytes, key);
		// 对加密结果进行 Base64 编码
		String encodedEncrypted = base64Encode(encryptedBytes);
		return encodedEncrypted + Character.toString(key);

	}

	private static String decode(String text) {
		int p = text.length() - 1;
		String encodedEncrypted = text.substring(0, p);
		byte key = (byte) text.substring(p).charAt(0);
		// 解密（首先进行 Base64 解码）
		byte[] decodedEncrypted = base64Decode(encodedEncrypted);
		byte[] decryptedBytes = xorEncryptDecrypt(decodedEncrypted, key);
		// 将解密后的字节数组转换回字符串
		String decrypted = new String(decryptedBytes, StandardCharsets.UTF_8);
		return decrypted;
	}

}
